﻿using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;

namespace AMing.Core.IO
{
    public class IniFileOperate
    {
        private string path;
        ///   <summary> 
        ///   实例初始化为指定路径的INI文件。 
        ///   </summary> 
        ///   <param   name= "path "> INI文件路径。 </param> 
        public IniFileOperate(string path)
        {
            this.path = path;
        }

        ///   <summary> 
        ///   获取INI文件的路径。 
        ///   </summary> 
        public string Path
        {
            get
            {
                return path;
            }
        }

        /// <summary>
        /// 读取某个项目>>键的值（字符型）
        /// </summary>
        /// <param name="sectionName">项目名称</param>
        /// <param name="keyName">键</param>
        /// <param name="defaultValue">找不到后，设定默认值</param>
        /// <returns>字符型</returns>
        public string ReadString(string sectionName, string keyName, string defaultValue)
        {
            const int MAXSIZE = 255;
            StringBuilder temp = new StringBuilder(MAXSIZE);
            GetPrivateProfileString(sectionName, keyName, defaultValue, temp, 255, this.path);
            return temp.ToString();
        }
        /// <summary>
        /// 写入某个项目>>键的值（字符串）
        /// </summary>
        /// <param name="sectionName">项目名称</param>
        /// <param name="keyName">键</param>
        /// <param name="value">值</param>
        public void WriteString(string sectionName, string keyName, string value)
        {
            WritePrivateProfileString(sectionName, keyName, value, this.path);
        }
        /// <summary>
        /// 读取某个项目>>键的值（整型）
        /// </summary>
        /// <param name="sectionName">项目名称</param>
        /// <param name="keyName">键</param>
        /// <param name="defaultValue">找不到后，设定默认值</param>
        /// <returns>整型</returns>
        public int ReadInteger(string sectionName, string keyName, int defaultValue)
        {
            return GetPrivateProfileInt(sectionName, keyName, defaultValue, this.path);
        }
        /// <summary>
        /// 写入某个项目>>键的值（整型）
        /// </summary>
        /// <param name="sectionName">项目名称</param>
        /// <param name="keyName">键</param>
        /// <param name="value">值</param>
        public void WriteInteger(string sectionName, string keyName, int value)
        {
            WritePrivateProfileString(sectionName, keyName, value.ToString(), this.path);
        }
        /// <summary>
        /// 读取某个项目>>键的值（逻辑型）
        /// </summary>
        /// <param name="sectionName">项目名称</param>
        /// <param name="keyName">键</param>
        /// <param name="defaultValue">找不到后，设定默认值</param>
        /// <returns>逻辑型</returns>
        public bool ReadBoolean(string sectionName, string keyName, bool defaultValue)
        {
            int temp = defaultValue ? 1 : 0;
            int result = GetPrivateProfileInt(sectionName, keyName, temp, this.path);
            return (result == 0 ? false : true);
        }
        /// <summary>
        /// 写入某个项目>>键的值（逻辑型）
        /// </summary>
        /// <param name="sectionName">项目名称</param>
        /// <param name="keyName">键</param>
        /// <param name="value">值</param>
        public void WriteBoolean(string sectionName, string keyName, bool value)
        {
            string temp = value ? "1 " : "0 ";
            WritePrivateProfileString(sectionName, keyName, temp, this.path);
        }

        ///   <summary> 
        ///   删除某个项目>>键
        ///   </summary> 
        ///   <param   name= "sectionName "> 项目名称 </param> 
        ///   <param   name= "keyName "> 键</param> 
        public void DeleteKey(string sectionName, string keyName)
        {
            WritePrivateProfileString(sectionName, keyName, null, this.path);
        }

        ///   <summary> 
        ///   删除某个项目的整个项 
        ///   </summary> 
        ///   <param   name= "sectionName "> 项目名称</param> 
        public void EraseSection(string sectionName)
        {
            WritePrivateProfileString(sectionName, null, null, this.path);
        }
        #region
        [DllImport("kernel32")]
        public static extern int WritePrivateProfileString(string lpApplicationName, string lpKeyName, string lpString, string lpFileName);
        [DllImport("kernel32")]
        public static extern int GetPrivateProfileInt(string lpApplicationName, string lpKeyName, int nDefault, string lpFileName);
        [DllImport("kernel32")]
        public static extern int GetPrivateProfileString(string lpApplicationName, string lpKeyName, string lpDefault, StringBuilder lpReturnedString, int nSize, string lpFileName);
        #endregion
    }
}